﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using CrystalDecisions.Web;
using CrystalDecisions.Shared;
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.CrystalReports;
using CrystalDecisions.ReportSource;
using System.Data.SqlClient;
using DAL;
using System.IO;
using BOL;
using Website.Logger;
using UtilityExtensions;
using BOL.Ventas;

namespace UILGestion.Rpt
{
    public partial class PrintForm : System.Web.UI.Page
    {
        private ReportDocument crystalReport;

        public PrintForm()
        {
            crystalReport = new ReportDocument();
        }

        protected void Page_Load(object sender, EventArgs e)
        {

            if (!IsPostBack)
            {

                try
                {
                
               
                type.Value=(string)Request.QueryString["type"];

                  
                //menuObraCtrl1.loadMenu(int.Parse(idObra.Value));
                //LoadReport();
                }


                catch (SqlException sqlex)
                {

                    WebServerSideSqlError.Log(sqlex);
                    ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                     "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


                }
                catch (Exception ex)
                {
                    Response.Write(ex.Message);
                    //WebServerSideError.Log(ex);
                    //ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                    // "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

                }

            }
            
                


                   
           
        }

        private void LoadKardex()
        {
            string inicioTextBox = (string)Request.QueryString["ini"];
            string finTextBox = (string)Request.QueryString["fin"];
            string almacenDropDownList = (string)Request.QueryString["idalmacen"];
            string resumen = (string)Request.QueryString["resu"];

            //(DD/MM/yyyy)
            System.IFormatProvider MiFp =
                new System.Globalization.CultureInfo("es-ES", false);


            KardexBL KARBOL = new KardexBL();
            DateTime fechainicio = DateTime.ParseExact(inicioTextBox, "dd/MM/yyyy", MiFp);
            DateTime fechaFin = DateTime.ParseExact(finTextBox, "dd/MM/yyyy", MiFp);
            

            // verificamos que lo que pide es el resumen

            if (resumen == "1")
            {
                crystalReport.Load(Server.MapPath("KardexValResuViewRPT.rpt"));
                var rest = KARBOL.loadKardexValResuRPT(fechainicio, fechaFin, int.Parse(almacenDropDownList));
                if (rest.Count == 0)
                {
                    throw new Exception("No existe informacion");
                }
                        crystalReport.SetDataSource(rest);
              
            }
            else
            {
                crystalReport.Load(Server.MapPath("KardexValViewRPT.rpt"));
                var dest = KARBOL.loadKardexValRPT(fechainicio, fechaFin, int.Parse(almacenDropDownList));
                if (dest.Count == 0)
                {
                    throw new Exception("No existe informacion");
                }
                crystalReport.SetDataSource(dest);
               

            }

            impresionDocumento.ReportSource = crystalReport;
        }

        private void LoadDocumentoVenta()
        {
            string idDocumento = (string)Request.QueryString["id"];
            

            //(DD/MM/yyyy)
            System.IFormatProvider MiFp =
                new System.Globalization.CultureInfo("es-ES", false);

            PageMargins margins = new PageMargins();
            DocumentoVentaBL bol = new DocumentoVentaBL();
            //verificamos que sea Boleta o Factura
            var documento = DbUtil.Db.DocumentoVentas.Single(p => p.idInternal == idDocumento.ToInt());
            //segun tipo
            switch (documento.idDocumentoTipo)
            {
                case 4:
                    crystalReport.Load(Server.MapPath("BoletaPrint.rpt"));
                    crystalReport.SetDataSource(bol.LoadBoletaPrint(documento.idInternal.ToInt()));
                    
                   
                   
                     margins.bottomMargin = 0;
                     margins.leftMargin = 0;
                     margins.rightMargin = 0;
                     margins.topMargin = 0;
                     crystalReport.PrintOptions.ApplyPageMargins(margins);
                     crystalReport.PrintOptions.PaperOrientation = PaperOrientation.Portrait;
                     crystalReport.PrintOptions.PaperSize = CrystalDecisions.Shared.PaperSize.DefaultPaperSize;

                     crystalReport.PrintOptions.PaperSource = PaperSource.Tractor;
                    crystalReport.PrintToPrinter(1,false,0,0);
                    
                    impresionDocumento.ReportSource = crystalReport;
                    impresionDocumento.PrintMode = PrintMode.ActiveX;
                    impresionDocumento.HasGotoPageButton=false;
                    impresionDocumento.HasSearchButton=false;
                    impresionDocumento.HasToggleGroupTreeButton=false;
                    impresionDocumento.HasZoomFactorList=false;
                    impresionDocumento.Height=50 ;
                    impresionDocumento.Width=350;
 
                    


                    break;
                case 2:
                    crystalReport.Load(Server.MapPath("BoletaPrint.rpt"));
                    crystalReport.SetDataSource(bol.LoadFacturaPrint(documento.idInternal.ToInt()));
                   
                     
                     margins.bottomMargin = 0;
                     margins.leftMargin = 0;
                     margins.rightMargin = 0;
                     margins.topMargin = 0;
                    crystalReport.PrintOptions.ApplyPageMargins(margins);
                    crystalReport.PrintOptions.PaperOrientation = PaperOrientation.Portrait;
                    crystalReport.PrintOptions.PaperSize = CrystalDecisions.Shared.PaperSize.DefaultPaperSize;
                    crystalReport.PrintToPrinter(1,false,0,0);
                    crystalReport.PrintOptions.PaperSource = PaperSource.Tractor;
                    impresionDocumento.ReportSource = crystalReport;
                    impresionDocumento.PrintMode = PrintMode.ActiveX;
                    impresionDocumento.HasGotoPageButton=false;
                    impresionDocumento.HasSearchButton=false;
                    impresionDocumento.HasToggleGroupTreeButton=false;
                    impresionDocumento.HasZoomFactorList=false;
                    impresionDocumento.Height=50 ;
                    impresionDocumento.Width=350;

                    break;
                default:
                    break;
            }
            
            
        }

        private void LoadKardexCierre()
        {
            string anioTextBox = (string)Request.QueryString["anio"];
            string mesTextBox = (string)Request.QueryString["mes"];
           
           
            string resumen = (string)Request.QueryString["resu"];
           

            //(DD/MM/yyyy)
            System.IFormatProvider MiFp =
                new System.Globalization.CultureInfo("es-ES", false);


            KardexBL KARBOL = new KardexBL();

            short anio=short.Parse(anioTextBox);
            short mes=short.Parse(mesTextBox);
            

          

            // verificamos que lo que pide es el resumen

            if (resumen == "1")
            {
                string almacenDropDownList = (string)Request.QueryString["idalmacen"];
                int idalmacen = short.Parse(almacenDropDownList);
                crystalReport.Load(Server.MapPath("KardexValResuViewRPT.rpt"));
                crystalReport.SetDataSource(KARBOL.GetCierreValResuRPT(anio, mes, idalmacen));
            }
            if (resumen == "0")
            {
                string almacenDropDownList = (string)Request.QueryString["idalmacen"];
                int idalmacen = short.Parse(almacenDropDownList);
                crystalReport.Load(Server.MapPath("KardexValViewRPT.rpt"));
                crystalReport.SetDataSource(KARBOL.GetCierreValRPT(anio,mes, idalmacen));
                


            }
             if (resumen == "2")
            {
                string idProyecto = (string)Request.QueryString["idProyecto"];
                crystalReport.Load(Server.MapPath("KardexValProyViewRPT.rpt"));
                crystalReport.SetDataSource(KARBOL.loadKardexValProyectoRPT(anio, mes, idProyecto.ToInt()));
            
                 }



            impresionDocumento.ReportSource = crystalReport;
        }


        private void LoadOrdenCompra()
        {
            internalid.Value = (string)Request.QueryString["id"];
            idAuxiliar.Value = (string)Request.QueryString["idAnticipo"];
            idObra.Value = (string)Request.QueryString["idObra"];
            //anticipo
            int? idAnticipo = (idAuxiliar.Value == "") ? null : idAuxiliar.Value.ToInt2();
            var ordenCompra = DbUtil.Db.OrdenCompras.Single(p => p.idInternal == int.Parse(internalid.Value));
            int idEmpresa = ordenCompra.Obra.Proyecto.idEmpresa.Value;

            BOL.OrdenCompraBL ocBL = new BOL.OrdenCompraBL();


            string directorio = Server.MapPath("~/App_Data/OrdenCompra/{0}/".Fmt(idEmpresa));
            if (!Directory.Exists(directorio))
                Directory.CreateDirectory(directorio);

            string archivo = Server.MapPath("~/App_Data/OrdenCompra/{0}/{1}.pdf".Fmt(idEmpresa, ordenCompra.numDocumento));


            //if (!File.Exists(archivo))
            //{
            //    string directorio
            //               = Server.MapPath("~/App_Data/OrdenCompra/{0}/".Fmt(idEmpresa));
            //    if (!Directory.Exists(directorio))
            //        Directory.CreateDirectory(directorio);
            //    ReportDocument crystalReport = new ReportDocument();

            //    crystalReport.Load(Server.MapPath("OrdenCompraViewRPT.rpt"));
            //    crystalReport.SetDataSource(ocBL.loadOrdenCompraRPT(int.Parse(internalid.Value), idAnticipo));


            //}
            if (File.Exists(archivo))
            {
                //eiminamos

            }

            crystalReport.Load(Server.MapPath("OrdenCompraViewRPT.rpt"));
            crystalReport.SetDataSource(ocBL.loadOrdenCompraRPT(int.Parse(internalid.Value), idAnticipo));
            //string ruta = Server.MapPath("~/App_Data/OrdenCompra/{0}/{1}.pdf".Fmt(Session["idEmpresa"], ordenCompra.numDocumento));
            crystalReport.ExportToDisk(ExportFormatType.PortableDocFormat, archivo);

            Response.Clear();
            Response.ContentType = "application/pdf";
            Response.AddHeader("Content-disposition", "attachment; filename={0}.pdf".Fmt(ordenCompra.numDocumento));
            Response.WriteFile(archivo);
            Response.Flush();
            Response.Close();
        }


        private void LoadComprativo()
        {
            internalid.Value = (string)Request.QueryString["idComparativoProv"];

            BOL.ComparativoBL comBL = new BOL.ComparativoBL();

            crystalReport.Load(Server.MapPath("ComparativoViewRPT.rpt"));


            crystalReport.SetDataSource(comBL.loadComparativoRPT(int.Parse(internalid.Value)));
            impresionDocumento.ReportSource = crystalReport;
        }

                         
        private void LoadProformaVenta()
        {
            internalid.Value = (string)Request.QueryString["id"];

            BOL.Ventas.ProformaBL comBL = new BOL.Ventas.ProformaBL();

            crystalReport.Load(Server.MapPath("ProformaVentaRPT.rpt"));


            crystalReport.SetDataSource(comBL.GetProformaRpt(int.Parse(internalid.Value)));
            impresionDocumento.ReportSource = crystalReport;
        }


        private void LoadGastoObra()
        {
            internalid.Value = (string)Request.QueryString["id"];
            var ordenCompra = DbUtil.Db.OrdenCompras.Single(p => p.idInternal == int.Parse(internalid.Value));
           int  idEmpresa = ordenCompra.Obra.Proyecto.idEmpresa.Value;

            BOL.OrdenCompraBL occBL = new BOL.OrdenCompraBL();
            string archivo1 = Server.MapPath("~/App_Data/GastoObra/{0}/{1}.pdf".Fmt(idEmpresa, ordenCompra.numDocumento));

            //if (!File.Exists(archivo))
            //{
            string directorio1 = Server.MapPath("~/App_Data/GastoObra/{0}/".Fmt(idEmpresa));
            if (!Directory.Exists(directorio1))
                Directory.CreateDirectory(directorio1);



            crystalReport.Load(Server.MapPath("GastoObraViewRPT.rpt"));
            crystalReport.SetDataSource(occBL.loadGastoObraRPT(int.Parse(internalid.Value)));

            //string ruta = Server.MapPath("~/App_Data/GastoObra/{0}/{1}.pdf".Fmt(Session["idEmpresa"], ordenCompra.numDocumento));
            crystalReport.ExportToDisk(ExportFormatType.PortableDocFormat, archivo1);



            Response.Clear();
            Response.ContentType = "application/pdf";
            Response.AddHeader("Content-disposition", "attachment; filename={0}.pdf".Fmt(ordenCompra.numDocumento));
            Response.WriteFile(archivo1);
            Response.Flush();
            Response.Close();
                
        }

        private void LoadReport()
          {

            switch (type.Value)
	        {
            case   "Kardex":
           
            LoadKardex();

            break;

            case "CIERRE":
            LoadKardexCierre();
            break;

            case "DOCUMENTOVENTA":
            LoadDocumentoVenta();   
            
            break;
            case "OC":
            LoadOrdenCompra();
           
           
            break;
            case "COMPARATIVO":
            LoadComprativo();


            break;
            case "GASTOOBRA":
            LoadGastoObra();

            break;
            case "CAJACHICA":
            internalid.Value = (string)Request.QueryString["id"];

            BOL.RendicionBL renBL = new BOL.RendicionBL();
            crystalReport.Load(Server.MapPath("RendicionViewRpt.rpt"));
            crystalReport.SetDataSource(renBL.loadRendicionRPT(int.Parse(internalid.Value)));
            impresionDocumento.ReportSource = crystalReport;

            break;
            case "PROFORMAVENTA":
            LoadProformaVenta();

            break;
                    
		
	}
            

        


    }

        protected void CrystalReportViewer1_ReportRefresh(object source, ViewerEventArgs e)
        {
            try{

            LoadReport();
               }


                catch (SqlException sqlex)
                {
                    WebServerSideSqlError.Log(sqlex);
                    ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                     "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


                }
                catch (Exception ex)
                {
                    WebServerSideError.Log(ex);
                    ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                     "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

                }
        }

        protected void CrystalReportViewer1_Load(object sender, EventArgs e)
        {
             try
                {
            LoadReport();
                }


             catch (SqlException sqlex)
             {
                 WebServerSideSqlError.Log(sqlex);
                 ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                  "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


             }
             catch (Exception ex)
             {
                 WebServerSideError.Log(ex);
                 ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                  "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

             }
        }

        protected void Page_UnLoad(object sender, EventArgs e)
        {
            impresionDocumento.Dispose();
            impresionDocumento = null;
            crystalReport.Close();
            crystalReport.Dispose();

        }
    }
}
